package orders;

import org.springframework.data.neo4j.annotation.GraphId;
import org.springframework.data.neo4j.annotation.NodeEntity;
import org.springframework.data.neo4j.annotation.RelatedTo;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @author XiaoDongLei
 * @Package com.vonzhou.springinaction.knights
 * @date 2018/4/1
 * @Description: 12.2.2　使用注解标注图实体
 *
 * Neo4j定义了两种类型的实体：节点（node）和关联关系（relationship）。一般来讲，节点反映了应用中的事物，而关联关系定义了这些事物是如何联系在一起的。
 *
 * Spring Data Neo4j提供了多个注解，它们可以应用在模型类型及其域上，实现Neo4j中的持久化。
 *
 * 1、@NodeEntity 将Java类型声明为节点实体
 * 2、@RelationshipEntity 将Java类型声明为关联关系实体
 * 3、@StartNode 将某个属性声明为关联关系实体的开始节点
 * 4、@EndNode 将某个属性声明为关联关系实体的结束节点
 * 5、@Fetch 将实体的属性声明为立即加载
 * 6、@GraphId 将某个属性设置为实体的ID域（这个域的类型必须是Long）
 * 7、@GraphProperty 明确声明某个属性
 * 8、@GraphTraversal 声明某个属性会自动提供一个iterable元素，这个元素是图遍历所构建的
 * 9、@Indexed 声明某个属性应该被索引
 * 10、@Labels 为@NodeEntity声明标签
 * 11、@Query 声明某个属性会自动提供一个iterable元素，这个元素是执行给定的Cypher查询所构建的
 * 12、@QueryResult 声明某个Java或接口能够持有查询的结果
 * 13、@RelatedTo 通过某个属性，声明当前的@NodeEntity与另外一个@NodeEntity之间的关联关系
 * 14、@RelatedToVia 在@NodeEntity上声明某个属性，指定其引用该节点所属的某一个@RelationshipEntity
 * 15、@RelationshipType 将某个域声明为关联实体类型
 * 16、@ResultColumn 在带有@QueryResult注解的类型上，将某个属性声明为获取查询结果集中的某个特定列
 *
 * 数据建模的一种方式就是将订单设定为一个节点，它会与一个或多个条目关联。连接两个节点的简单关联关系，关系本身不包含任何属性
 *
 */
@NodeEntity
public class Order {

	@GraphId
	private Long id;

	private String customer;

	private String type;

	/**
	 * type属性实际上就是为关联关系建立了一个文本标记。它可以设置成任意的值，但通常会给定一个易于人类阅读的文本，用来简单描述这个关联关系的特征。稍后，你将会看到如何将这个标记用在查询中，实现跨关联关系的查询。
	 *
	 */
	@RelatedTo(type = "HAS_ITEMS")
	private Set<Item> items = new LinkedHashSet<Item>();

	public String getCustomer() {
		return customer;
	}

	public void setCustomer(String customer) {
		this.customer = customer;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Collection<Item> getItems() {
		return items;
	}

	public void setItems(Set<Item> items) {
		this.items = items;
	}

	public Long getId() {
		return id;
	}

}
